dnsmasq : Le serveur DNS et DHCP facile sous Linux

 

Table des matières

  1. 1.Introduction 

  2. 2.Installation de DNSMASQ 

  3. 3.Configuration de DNSMASQ 

    1. 1.Fichiers de bse et gestion du service 

    2. 2.DNSMASQ : Paramétrage DNS 

    3. 3.DNSMASQ : Paramétrage DHCP 

      1. 1.Paramétrage avec un seul réseau 

      2. 2.Paramétrage avec plusieurs sous-réseaux 

      3. 3.DNSMASQ : Paramétrage commun DHCP 

  4. 4.Gestion des logs 

Introduction



DnsMasq est un petit serveur DNS qui met en cache et vous permet d'ajouter des résolutions de nom pour les hôtes de votre réseau local.
Il est peu gourmand en ressources, et est paramétrable facilement !

Il peut convenir parfaitement en lieu et place de l'usine à gaz de Bind lorsqu'on cherche quelque chose de simple.

Il comporte aussi la gestion d'un serveur DHCP, la classe !

Par défaut, dnsmasq forward les requêtes inconnues grâce aux DNS paramétrés sur l'OS sur lequel est installé dnsmasq et les enregistrements A et AAAA (résolutions noms -> IP) sont lus depuis le fichier /etc/hosts ! (c'est paramétrable). Résolution directe et inverse s'il vous plait !

Pour la partie DHCP, l'outil gère un ou plusieurs réseaux !

Il gère aussi le TFTP et quelques autres bricoles non abordées ici.

DnsMasq est recommandé sur des petits réseaux.

Les fichiers de configuration exposés ci-dessous sont ceux utilisé en prod, avec les plans IP et noms de domaine changés.

Cependant, voici mon retour d'expérience : Je l'utilise au travail (sous CentOS 8) pour environ 350 machines et 20 sous-réseaux, sans dysfonctionnements majeurs. D'après les statistiques dans les fichiers de logs, cela représente environ 375.000 requêtes DNS jour et 19.000 requêtes DHCPREQUEST.

Installation de DNSMASQ



Suivant votre distribution, installez le paquet dnsmasq !

CentOS :

Copier vers le presse-papierCode BASH :

yum install dnsmasq



Gentoo :

Copier vers le presse-papierCode BASH :

emerge -av  dnsmasq



Debian :

Copier vers le presse-papierCode BASH :

apt install dnsmasq


Configuration de DNSMASQ

 

Fichiers de bse et gestion du service



Toute la configuration résulte dans le fichier /etc/dnsmasq.conf
Il est de base bien documenté, mais il est très très rempli.

Je préfère travailler sur un fichier /etc/dnsmasq.conf vierge et copier l'original :

Copier vers le presse-papierCode BASH :

mv /etc/dnsmasq.conf  /etc/dnsmasq.conf.ori



S'assurer que le service est activé :

Sous systemd :

Copier vers le presse-papierCode BASH :

systemctl enable dnsmasq



Sous OpenRC :

Copier vers le presse-papierCode BASH :

rc-update add dnsmasq default



Après chaque modification il est nécessaire de relancer le service dnsmasq :

Sous systemd :

Copier vers le presse-papierCode BASH :

systemctl restart dnsmasq



Sous OpenRC :

Copier vers le presse-papierCode BASH :

/etc/init.d/dnsmasq restart

 

DNSMASQ : Paramétrage DNS



Pour la partie DNS, voici ce qu'on peut paramétrer :

Copier vers le presse-papierCode BASH :

#### DNS ####

domain-needed

bogus-priv

# Ficher des forwarders

resolv-file=/etc/dnsmasq-dns.conf

strict-order

user=dnsmasq

group=dnsmasq

# Fichier des enregistrements A et AAAA

addn-hosts=/etc/dnsmasq-hosts.conf

expand-hosts

domain=linuxtricks.lan

# LOG DNS

log-queries



Quelques explications :
- domain-needed : Permet de ne pas transmettre au forwarder une résolution de nom qui n'est pas pleinement qualifié.
- bogus-priv : Permet de ne pas transmettre aux forwarders les résolutions inverses non trouvées par la configuration locale
- resolv-file : Permet de définir un fichier de configuration différent que /etc/resolv.conf
- strict-order : Permet de respecter l'ordre strict des différents DNS paramétrés dans le fichier resolv.conf
- user et group : Permet de définir l'utilisateur et le groupe sous lequel dnsmasq sera lancé (défini ainsi sur CentOS)
- addn-hosts : Permet de définir un fichier de configuration différent que /etc/hosts pour la résolution des noms
- expand-hosts : Ajoute automatiquement le domaine aux noms simples
- domain : Définit le domaine (suffixe aux noms locaux)
- log-queries : Permet de logguer les requêtes DNS (par défaut dans /var/log/messages) - Très verbeux, utile pour du debug

Comme vous l'avez vu, je ne souhaite pas utiliser /etc/resolv.conf et /etc/hosts par défaut. Cependant leur syntaxe est la même :

Voici un exemple de /etc/dnsmasq-dns.conf :

Copier vers le presse-papierCode BASH :

nameserver 8.8.8.8

nameserver 91.121.161.184



Voici un exemple de /etc/dnsmasq-hosts.conf :

Copier vers le presse-papierCode BASH :

## LAN DIJON ##

192.168.21.19    dns dhcp

192.168.21.238    proxy wpad

192.168.21.253    switch

192.168.21.254    gwdij

 



Bien sûr, on relance le service après avoir enregistré sa configuration.

On va évidemment autoriser dans le parefeu les requêtes DNS.

Avec firewalld :

Copier vers le presse-papierCode BASH :

firewall-cmd --add-service=dns --permanent

firewall-cmd --reload


DNSMASQ : Paramétrage DHCP

 

Paramétrage avec un seul réseau



Pour paramétrer le serveur DHCP avec un seul réseau, c'est assez facile.
Le paramétrage se fait toujours dans /etc/dnsmasq.conf :

Copier vers le presse-papierCode BASH :

log-dhcp

dhcp-range=192.168.21.10,192.168.21.50,12h

dhcp-option=option:netmask,255.255.255.0

dhcp-option=option:router,192.168.21.254

dhcp-option=option:dns-server,192.168.21.254

dhcp-option=option:ntp-server,192.168.21.254

dhcp-option=option:domain-name,linuxtricks.lan



Quelques explications :
- log-dhcp : Permet de logguer les échanges DHCP (par défaut dans /var/log/messages) - Très verbeux, utile pour du debug
- dhcp-range : Plage DHCP (Début, Fin, Durée du bail)
- dhcp-option=option:netmask : Masque de sous réseau
- dhcp-option=option:router : Passerelle
- dhcp-option=option:dns-server : Serveur DNS (Si le DNS est la même machine, ne mettez pas 127.0.0.1 mais son adresse réseau, exemple 192.168.21.19)
- dhcp-option=option:ntp-server : Serveur NTP (facultatif)
- dhcp-option=option:domain-name : Suffixe DNS

Il est possible de faire une réservation, avec l'adresse MAC :

Copier vers le presse-papierCode BASH :

dhcp-host=2c:27:d7:01:71:08,192.168.21.111



Il est aussi possible d'ignorer les requête d'un hôte particulier :

Copier vers le presse-papierCode BASH :

dhcp-host=2c:27:d7:01:71:08,ignore


Paramétrage avec plusieurs sous-réseaux



Avec une problématique d'entreprise, on a un serveur DHCP et plusieurs réseaux. Sur les LANs distants, on a des agents relais sur les routeurs qui vont transmettre les requêtes en unicast au présent serveur DHCP de DnsMasq.

Pour paramétrer le serveur DHCP avec plusieurs sous-réseaux, c'est assez facile. Il suffit de tagguer les réseaux concernés
Le paramétrage se fait toujours dans /etc/dnsmasq.conf :

Copier vers le presse-papierCode BASH :

#### DHCP ####

## LOG DHCP

log-dhcp

## Options GLOBALES ##

dhcp-option=option:dns-server,192.168.21.19

dhcp-option=option:domain-name,linuxtricks.lan

## LANPROD ##

dhcp-range=lanprod,192.168.21.100,192.168.21.150,255.255.255.0,1h

dhcp-option=lanprod,option:router,192.168.21.254

dhcp-option=lanprod,option:netmask,255.255.255.0

# Video Projecteur

dhcp-host=lanprod,00:1a:ef:53:e5:1a,192.168.21.242

# PC Bureau Informatique

dhcp-host=lanprod,00:25:64:b4:44:fe,192.168.21.20

## LAN DEV Informatique Derrière Bintec ##

dhcp-range=devit,192.168.27.100,192.168.27.200,255.255.255.0,30m

dhcp-option=devit,option:router,192.168.27.240

dhcp-option=devit,option:netmask,255.255.255.0

# Resa test

# dhcp-host=devit,2c:27:d7:01:71:08,192.168.27.212

# Blacklist test

# dhcp-host=devit,2c:27:d7:01:71:08,ignore

 



Il y a dans cette configuration un exemple de réservation et de blacklist.

Par rapport à la configuration DHCP pour 1 réseau, on a :
- Ajouté un TAG ( lanprod et devit). Ainsi toutes les lignes correspondant au TAG sont appliquées (ici, la réservation Vidéo projecteur ne s'applique que si l'hôte est dans le "lanprod") L'absence de TAG "transforme" en quelque sorte les options comme des options globales (De serveur et non d'étendue)
- Ajouté pour les dhcp-range le masque de sous réseau en plus. Avec un seul réseau, c'est facultatif, car le masque de l'interface du système est utilisée. Quand on a plusieurs sous-réseaux, si on ne veut pas que le masque par défaut soit appliqué (255.0.0.0 pour un réseau en 10.x.y.z) il faut le préciser.

DNSMASQ : Paramétrage commun DHCP



Le fichier dans lequel on peut consulter les beaux actif est /var/lib/dnsmasq/dnsmasq.leases

Voici un exemple :

Copier vers le presse-papierCode BASH :

1582044982 00:25:64:a0:66:0a 192.168.21.108 DESKTOP-MRBILVQ 01:00:25:64:a0:66:0a

1582042908 2c:27:d7:01:71:08 192.168.27.113 PCNOMA2 01:2c:27:d7:01:71:08

1582044708 00:68:eb:79:90:dc 192.168.21.106 PCBOCY1 01:00:68:eb:79:90:dc

1582044670 74:f0:6d:2b:87:37 192.168.21.101 PCPTQUA4 01:74:f0:6d:2b:87:37

1582044233 18:60:24:17:7a:c6 192.168.21.102 PCZOFA1 01:18:60:24:17:7a:c6



Après chaque modification de configuration, on relance le service :

On va évidemment autoriser dans le parefeu les requêtes DHCP.

Avec firewalld :

Copier vers le presse-papierCode BASH :

firewall-cmd --add-service=dhcp --permanent

firewall-cmd --reload


Gestion des logs



Utilisant rsyslog, les logs sont verbeux.
Ils sont utiles pour le débug mais vont se stocker par défaut dans /var/log/messages.
Ce n'est pas facile, et j'ai préféré les séparer.

J'ai donc paramétré rsyslog pour envoyer les logs dans /var/log/dnsmasq.log.

On édite le fichier /etc/rsyslog.conf.

Avant toutes les autres règles de logs, on vient mettre ce template :

Copier vers le presse-papierCode BASH :

if ( $programname startswith "dnsmasq" ) then {

    action(type="omfile" file="/var/log/dnsmasq.log" flushOnTXEnd="off")

    stop

}



On enregistre et redémarre rsyslog.

J'utilise aussi logrotate, j'ai donc créé un fichier /etc/logrotate.d/dnsmasq pour faire tourner les logs et les compresser, en en gardant 1 semaine de jeu :

Copier vers le presse-papierCode BASH :

/var/log/dnsmasq.log {

    daily

    rotate 7

    compress

    delaycompress

    missingok

    notifempty

    postrotate

        systemctl restart rsyslog.service

    endscript

}



A noter, on doit redémarrer rsyslog après la rotation afin d'écrire dans le nouveau dnsmasq.log !